const axios = require("axios");
const assert = require("assert");

// 测试配置
const BASE_URL = "http://localhost:3001";
const USER_TOKEN = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InRlc3R1c2VyIiwidXNlcmlkIjoidGVzdF91c2VyXzEyMyIsImlhdCI6MTcwMDAwMDAwMCwiZXhwIjoxODAwMDAwMDAwfQ.fake_signature"; // 测试用token

// 创建axios实例
const api = axios.create({
  baseURL: BASE_URL,
  headers: {
    "Content-Type": "application/json",
    token: USER_TOKEN,
  },
});

// 测试数据
let testData = {
  userid: "test_user_123",
  orderTime: null,
  testProductId: "test_product_001",
  testCartItems: [],
};

/**
 * 订单接口API测试 - 添加订单
 */
async function testAddOrderAPI() {
  console.log("\n=== 测试添加订单API ===");

  try {
    // 1. 测试添加订单 - 正常情况
    console.log("1. 测试添加订单 - 正常情况...");
    const addOrderResponse = await api.post("/api/order/addOrder", {
      userid: testData.userid,
    });
    
    // 验证响应结构
    assert.strictEqual(addOrderResponse.data.code, "200");
    assert.strictEqual(addOrderResponse.data.message, "添加订单");
    assert(addOrderResponse.data.time, "应该返回订单时间");
    
    // 保存订单时间用于后续测试
    testData.orderTime = addOrderResponse.data.time;
    console.log("✓ 添加订单成功，订单时间:", testData.orderTime);

    // 2. 测试添加订单 - 缺少参数
    console.log("2. 测试添加订单 - 缺少参数...");
    try {
      await api.post("/api/order/addOrder", {});
      console.log("❌ 应该返回错误，但请求成功了");
    } catch (error) {
      console.log("✓ 正确处理了缺少参数的情况");
    }

    console.log("✅ 添加订单API测试通过");
  } catch (error) {
    console.error(
      "❌ 添加订单API测试失败:",
      error.response?.data || error.message
    );
    throw error;
  }
}

/**
 * 订单接口API测试 - 获取确认订单信息
 */
async function testConfirmOrderAPI() {
  console.log("\n=== 测试获取确认订单信息API ===");

  try {
    // 1. 测试获取确认订单信息 - 正常情况
    console.log("1. 测试获取确认订单信息 - 正常情况...");
    const confirmResponse = await api.get("/api/order/confirmOrder", {
      params: {
        userid: testData.userid,
        time: testData.orderTime,
      },
    });
    
    // 验证响应结构
    assert.strictEqual(confirmResponse.data.code, "200");
    assert.strictEqual(confirmResponse.data.message, "获取确认订单的信息");
    assert(typeof confirmResponse.data.flag === "boolean", "应该返回flag字段");
    assert(Array.isArray(confirmResponse.data.data), "应该返回订单数据数组");
    
    console.log("✓ 获取确认订单信息成功");
    console.log("  - 地址信息标志:", confirmResponse.data.flag);
    console.log("  - 订单数据条数:", confirmResponse.data.data.length);

    // 2. 测试获取确认订单信息 - 缺少参数
    console.log("2. 测试获取确认订单信息 - 缺少参数...");
    try {
      await api.get("/api/order/confirmOrder", {
        params: {
          userid: testData.userid,
          // 缺少time参数
        },
      });
      console.log("❌ 应该返回错误，但请求成功了");
    } catch (error) {
      console.log("✓ 正确处理了缺少参数的情况");
    }

    // 3. 测试获取确认订单信息 - 无效时间
    console.log("3. 测试获取确认订单信息 - 无效时间...");
    const invalidTimeResponse = await api.get("/api/order/confirmOrder", {
      params: {
        userid: testData.userid,
        time: "invalid_time",
      },
    });
    
    // 应该返回空数据
    assert.strictEqual(invalidTimeResponse.data.code, "200");
    console.log("✓ 正确处理了无效时间的情况");

    console.log("✅ 获取确认订单信息API测试通过");
  } catch (error) {
    console.error(
      "❌ 获取确认订单信息API测试失败:",
      error.response?.data || error.message
    );
    throw error;
  }
}

/**
 * 订单接口API测试 - 修改订单地址
 */
async function testUpdateOrderAddressAPI() {
  console.log("\n=== 测试修改订单地址API ===");

  try {
    // 1. 测试修改订单地址 - 正常情况
    console.log("1. 测试修改订单地址 - 正常情况...");
    const updateResponse = await api.post("/api/order/updateOrderAddress", {
      userid: testData.userid,
      time: testData.orderTime,
      name: "测试收货人",
      tel: "13800138000",
      province: "广东省",
      city: "深圳市",
      county: "南山区",
      addressDetail: "科技园南区测试地址123号",
    });
    
    // 验证响应结构
    assert.strictEqual(updateResponse.data.code, "200");
    assert.strictEqual(updateResponse.data.message, "修改订单的地址");
    
    console.log("✓ 修改订单地址成功");

    // 2. 测试修改订单地址 - 缺少必要参数
    console.log("2. 测试修改订单地址 - 缺少必要参数...");
    try {
      await api.post("/api/order/updateOrderAddress", {
        userid: testData.userid,
        // 缺少time和地址信息
      });
      console.log("❌ 应该返回错误，但请求成功了");
    } catch (error) {
      console.log("✓ 正确处理了缺少参数的情况");
    }

    // 3. 测试修改订单地址 - 无效订单
    console.log("3. 测试修改订单地址 - 无效订单...");
    const invalidOrderResponse = await api.post("/api/order/updateOrderAddress", {
      userid: testData.userid,
      time: "invalid_time",
      name: "测试收货人",
      tel: "13800138000",
      province: "广东省",
      city: "深圳市",
      county: "南山区",
      addressDetail: "科技园南区测试地址123号",
    });
    
    // 应该正常返回，但不会更新任何数据
    assert.strictEqual(invalidOrderResponse.data.code, "200");
    console.log("✓ 正确处理了无效订单的情况");

    console.log("✅ 修改订单地址API测试通过");
  } catch (error) {
    console.error(
      "❌ 修改订单地址API测试失败:",
      error.response?.data || error.message
    );
    throw error;
  }
}

/**
 * 订单接口API测试 - 删除购物车选中项目
 */
async function testDeleteCartItemAPI() {
  console.log("\n=== 测试删除购物车选中项目API ===");

  try {
    // 1. 测试删除购物车选中项目 - 正常情况
    console.log("1. 测试删除购物车选中项目 - 正常情况...");
    const deleteResponse = await api.get("/api/order/deleteCartItem", {
      params: {
        userid: testData.userid,
      },
    });
    
    // 验证响应结构
    assert.strictEqual(deleteResponse.data.code, "200");
    assert.strictEqual(deleteResponse.data.message, "支付时删除购物车选中的数据");
    
    console.log("✓ 删除购物车选中项目成功");

    // 2. 测试删除购物车选中项目 - 缺少参数
    console.log("2. 测试删除购物车选中项目 - 缺少参数...");
    try {
      await api.get("/api/order/deleteCartItem", {
        params: {},
      });
      console.log("❌ 应该返回错误，但请求成功了");
    } catch (error) {
      console.log("✓ 正确处理了缺少参数的情况");
    }

    // 3. 测试删除购物车选中项目 - 无效用户
    console.log("3. 测试删除购物车选中项目 - 无效用户...");
    const invalidUserResponse = await api.get("/api/order/deleteCartItem", {
      params: {
        userid: "invalid_user_id",
      },
    });
    
    // 应该正常返回，但不会删除任何数据
    assert.strictEqual(invalidUserResponse.data.code, "200");
    console.log("✓ 正确处理了无效用户的情况");

    console.log("✅ 删除购物车选中项目API测试通过");
  } catch (error) {
    console.error(
      "❌ 删除购物车选中项目API测试失败:",
      error.response?.data || error.message
    );
    throw error;
  }
}

/**
 * JWT认证测试
 */
async function testJWTAuthentication() {
  console.log("\n=== 测试JWT认证 ===");

  try {
    // 1. 测试无token访问
    console.log("1. 测试无token访问...");
    const apiWithoutToken = axios.create({
      baseURL: BASE_URL,
      headers: {
        "Content-Type": "application/json",
      },
    });
    
    try {
      await apiWithoutToken.post("/api/order/addOrder", {
        userid: testData.userid,
      });
      console.log("❌ 应该返回认证错误，但请求成功了");
    } catch (error) {
      if (error.response?.status === 401 || error.response?.status === 403) {
        console.log("✓ 正确拒绝了无token的请求");
      } else {
        console.log("✓ 服务器处理了无token的请求");
      }
    }

    // 2. 测试无效token访问
    console.log("2. 测试无效token访问...");
    const apiWithInvalidToken = axios.create({
      baseURL: BASE_URL,
      headers: {
        "Content-Type": "application/json",
        token: "invalid_token_123",
      },
    });
    
    try {
      await apiWithInvalidToken.post("/api/order/addOrder", {
        userid: testData.userid,
      });
      console.log("❌ 应该返回认证错误，但请求成功了");
    } catch (error) {
      if (error.response?.status === 401 || error.response?.status === 403) {
        console.log("✓ 正确拒绝了无效token的请求");
      } else {
        console.log("✓ 服务器处理了无效token的请求");
      }
    }

    console.log("✅ JWT认证测试完成");
  } catch (error) {
    console.error(
      "❌ JWT认证测试失败:",
      error.response?.data || error.message
    );
    // 不抛出错误，因为认证测试可能需要实际的认证配置
  }
}

/**
 * 订单接口完整流程测试
 */
async function testOrderWorkflow() {
  console.log("\n=== 测试订单完整流程 ===");

  try {
    console.log("1. 添加订单...");
    const addResponse = await api.post("/api/order/addOrder", {
      userid: testData.userid,
    });
    const orderTime = addResponse.data.time;
    
    console.log("2. 获取订单确认信息...");
    const confirmResponse = await api.get("/api/order/confirmOrder", {
      params: {
        userid: testData.userid,
        time: orderTime,
      },
    });
    
    console.log("3. 修改订单地址...");
    await api.post("/api/order/updateOrderAddress", {
      userid: testData.userid,
      time: orderTime,
      name: "流程测试收货人",
      tel: "13900139000",
      province: "北京市",
      city: "北京市",
      county: "朝阳区",
      addressDetail: "测试流程地址456号",
    });
    
    console.log("4. 验证地址修改...");
    const updatedConfirmResponse = await api.get("/api/order/confirmOrder", {
      params: {
        userid: testData.userid,
        time: orderTime,
      },
    });
    
    // 验证地址是否更新（简化验证）
    console.log("✓ 地址修改请求已发送");
    
    console.log("5. 删除购物车选中项目...");
    await api.get("/api/order/deleteCartItem", {
      params: {
        userid: testData.userid,
      },
    });
    
    console.log("✅ 订单完整流程测试通过");
  } catch (error) {
    console.error(
      "❌ 订单完整流程测试失败:",
      error.response?.data || error.message
    );
    throw error;
  }
}

// 添加延迟函数
function delay(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

/**
 * 主测试函数
 */
async function runAllTests() {
  console.log("🚀 开始订单接口API测试");
  console.log("请确保：");
  console.log("1. 服务器正在运行 (http://localhost:3001)");
  console.log("2. 已设置正确的用户token");
  console.log("3. 数据库连接正常");

  try {
    await testJWTAuthentication();
    await delay(1000); // 等待1秒
    
    await testAddOrderAPI();
    await delay(1000); // 等待1秒
    
    await testConfirmOrderAPI();
    await delay(1000); // 等待1秒
    
    await testUpdateOrderAddressAPI();
    await delay(1000); // 等待1秒
    
    await testDeleteCartItemAPI();
    await delay(1000); // 等待1秒

    console.log("\n🎉 所有订单接口API测试通过！");
  } catch (error) {
    console.error("\n💥 测试失败:", error.message);
    process.exit(1);
  }
}

// 运行测试
if (require.main === module) {
  runAllTests();
}

module.exports = {
  runAllTests,
  testAddOrderAPI,
  testConfirmOrderAPI,
  testUpdateOrderAddressAPI,
  testDeleteCartItemAPI,
  testJWTAuthentication,
  testOrderWorkflow,
};